home *** CD-ROM | disk | FTP | other *** search
-
- { Turbo Pascal version 7.0 directive settings }
- {$a+,b-,d+,e+,f-,g+,i+,l+,n-,o-,p-,q-,r-,s+,t-,v+,x+}
-
- { if you have a 386 or better 'uncomment' the next line }
- {-$define cpu386}
-
- program wormhole;
- { Asm-version of Wormhole, by Bas van Gaalen, Holland, PD }
- uses
- crt;
- const
- vidseg:word=$a000;
- divd=128;
- astep=6;
- xst=4;
- yst=5;
- var
- sintab:array[0..449] of integer;
- stab,ctab:array[0..255] of integer;
- virscr:pointer;
- virseg:word;
- lstep:byte;
-
- procedure setpal(col,r,g,b : byte); assembler;
- asm
- mov dx,03c8h
- mov al,col
- out dx,al
- inc dx
- mov al,r
- out dx,al
- mov al,g
- out dx,al
- mov al,b
- out dx,al
- end;
-
- procedure drawpolar(xo,yo,r,a:word; c:byte; lvseg:word); assembler;
- asm
- mov es,lvseg
-
- mov bx,a
- add bx,a
- mov cx,word ptr sintab[bx]
- add bx,2*90
- mov ax,word ptr sintab[bx]
- mul r
- mov bx,divd
- xor dx,dx
- cwd
- idiv bx
- add ax,xo
- add ax,160
- cmp ax,320
- ja @out
- mov si,ax
-
- mov ax,cx
- mul r
- mov bx,divd
- xor dx,dx
- cwd
- idiv bx
- add ax,yo
- add ax,100
- cmp ax,200
- ja @out
-
- shl ax,6
- mov di,ax
- shl ax,2
- add di,ax
- add di,si
- mov al,c
- mov [es:di],al
- @out:
- end;
-
- procedure cls(lvseg:word); assembler;
- asm
- mov es,[lvseg]
- xor di,di
- xor ax,ax
- {$ifdef cpu386}
- mov cx,320*200/4
- rep
- db $66; stosw
- {$else}
- mov cx,320*200/2
- rep stosw
- {$endif}
- end;
-
- procedure flip(src,dst:word); assembler;
- asm
- push ds
- mov ax,[dst]
- mov es,ax
- mov ax,[src]
- mov ds,ax
- xor si,si
- xor di,di
- {$ifdef cpu386}
- mov cx,320*200/4
- rep
- db $66; movsw
- {$else}
- mov cx,320*200/2
- rep movsw
- {$endif}
- pop ds
- end;
-
- procedure retrace; assembler;
- asm
- mov dx,03dah
- @vert1:
- in al,dx
- test al,8
- jnz @vert1
- @vert2:
- in al,dx
- test al,8
- jz @vert2
- end;
-
- var x,y,i,j:word; c:byte;
- begin
- asm mov ax,13h; int 10h; end;
- for i:=0 to 255 do begin
- ctab[i]:=round(cos(pi*i/128)*60);
- stab[i]:=round(sin(pi*i/128)*45);
- end;
- for i:=0 to 449 do sintab[i]:=round(sin(2*pi*i/360)*divd);
- getmem(virscr,64000);
- virseg:=seg(virscr^);
- cls(virseg);
- x:=30; y:=90;
- repeat
- {retrace;}
- c:=22; lstep:=2; j:=10;
- while j<220 do begin
- i:=0;
- while i<360 do begin
- drawpolar(ctab[(x+(200-j)) mod 255],stab[(y+(200-j)) mod 255],j,i,c,virseg);
- inc(i,astep);
- end;
- inc(j,lstep);
- if (j mod 5)=0 then begin inc(lstep); inc(c); if c>31 then c:=22; end;
- end;
- x:=xst+x mod 255;
- y:=yst+y mod 255;
- flip(virseg,vidseg);
- cls(virseg);
- until keypressed;
- while keypressed do readkey;
- freemem(virscr,64000);
- textmode(lastmode);
- end.
-